using System;
using Hangfire;
using Microsoft.AspNetCore.Hosting;
using NP.BPMReportPlatform.BPMEngine;
using NP.BPMReportPlatform.CourseTrain;
using NP.BPMReportPlatform.RecurringJobs;
using NP.BPMReportPlatform.Resume;
using Volo.Abp.DependencyInjection;

namespace NP.BPMReportPlatform.BackgroundJobs.Host
{
    public class BpmReportPlatformJobCreator : ITransientDependency
    {
        public void CreateJobs(IWebHostEnvironment env)
        {

            //老BPM定时服务配置入口
            BpmPlatformJobCreator.CreateJobs(env);

            //每天凌晨6点，14点 定时同步人员和部门信息
            RecurringJob.AddOrUpdate<IEmployeeRecurringJob>("定时同步人员信息", c => c.SyncPortalEmployeeAsync(), "0 6,14 * * *", TimeZoneInfo.Local);

            //每天凌晨5点 定时同步部门信息
            RecurringJob.AddOrUpdate<IEmployeeRecurringJob>("定时同步部门信息", c => c.SyncOrgAsync(), "0 5 * * *", TimeZoneInfo.Local);

            //定时同步微信用户
            RecurringJob.AddOrUpdate<IEmployeeRecurringJob>("定时同步微信用户", c => c.SyncWeChatUserAsync(), "10 6 * * *", TimeZoneInfo.Local);

            // 定时同步组织主管信息
            RecurringJob.AddOrUpdate<IEmployeeRecurringJob>("定时同步组织主管信息", c => c.SyncOrgLeaderAsync(), "0 7 * * *", TimeZoneInfo.Local);

            // 定时同步公司编码与名称从hana
            RecurringJob.AddOrUpdate<IEmployeeRecurringJob>("从hana同步公司编码与名称到BPM库", c => c.SyncCompanyAsync(), "0 2 * * *", TimeZoneInfo.Local);

            // 定时更新购方红字信息表的红字发票信息
            RecurringJob.AddOrUpdate<IBuyerScarletInformationJob>("定时更新购方红字信息表的红字发票信息", c => c.UpdateCompleteRedInvoiceCode(), "*/15 * * * *", TimeZoneInfo.Local);
            // 定时更新购方红字信息表的电子发票
            //RecurringJob.AddOrUpdate<IBuyerScarletInformationJob>("定时更新购方红字信息表的电子发票", c => c.UpdateElectronicInvoiceCode(), "0 3 * * *", TimeZoneInfo.Local);

            //以下定时任务只有生产环境才启用
            if (env.EnvironmentName.Equals("Production"))
            {

                // 定时同步泛微待办
                RecurringJob.AddOrUpdate<IToDoAppServiceJob>("定时同步泛微待办", c => c.SyncFanWeiToDo(), "0 12,23 * * *", TimeZoneInfo.Local);

                // 定时同步BPM待办
                RecurringJob.AddOrUpdate<IToDoAppServiceJob>("定时同步BPM待办", c => c.SyncBPMToDo(), "10 12,23 * * *", TimeZoneInfo.Local);

                // 定时同步BPMNEW待办
                RecurringJob.AddOrUpdate<IToDoAppServiceJob>("定时同步BPMNEW待办", c => c.SyncBPMNEWToDo(), "15 12,23 * * *", TimeZoneInfo.Local);

                // 定时同步RiskHT待办
                RecurringJob.AddOrUpdate<IToDoAppServiceJob>("定时同步RiskHT待办", c => c.SyncRiskHTToDo(), "20 12,23 * * *", TimeZoneInfo.Local);

                // 定时同步RiskXY待办
                RecurringJob.AddOrUpdate<IToDoAppServiceJob>("定时同步RiskXY待办", c => c.SyncRiskXYToDo(), "25 12,23 * * *", TimeZoneInfo.Local);

                // 定时同步WebOA待办
                RecurringJob.AddOrUpdate<IToDoAppServiceJob>("定时同步WebOA待办", c => c.SyncWebOAToDo(), "30 12,23 * * *", TimeZoneInfo.Local);

                // 定时同步移动报销待办
                RecurringJob.AddOrUpdate<IToDoAppServiceJob>("定时同步移动报销待办", c => c.SyncCloudPenseToDo(), "35 12,23 * * *", TimeZoneInfo.Local);


                // 定时同步资本资出待办
                RecurringJob.AddOrUpdate<IToDoAppServiceJob>("定时同步资本资出待办", c => c.SyncZBZCToDo(), "45 12,23 * * *", TimeZoneInfo.Local);


                // 催办逾期未处理的AUTO依赖书流程(周一早上8点对超过7天已入库未处理的单子进行特殊催办)
                RecurringJob.AddOrUpdate<IFlowUrgingRecurringJob>("催办逾期未处理的流程(依赖书试线反馈特殊催办)", c => c.AutoFlowUrgingTo1Async(), "0 0 08 ? * MON", TimeZoneInfo.Local);

                // 定时发送立才中心认证需求管理流程3个月和半年内到期的证书人员
                RecurringJob.AddOrUpdate<ILCZXRZXQGLRecurringJob>("定时发送立才中心认证需求管理流程3个月和半年内到期的证书人员", c => c.SendEmailByExpiredCertificateNumber(), "0 3 * * *", TimeZoneInfo.Local);

                // 框架订单更新离职人员金额 0 并推送
                RecurringJob.AddOrUpdate<IFrameOrderRecurringJob>("框架订单更新离职人员金额", c => c.UpdateResignationUser(), "0 8,18 * * *", TimeZoneInfo.Local);

                // 框架订单推送数据到移动报销和SAP
                RecurringJob.AddOrUpdate<IFrameOrderRecurringJob>("框架订单推送数据到移动报销和SAP", c => c.SyncFrameOrder(), "0 0 0 16,26 * ? ", TimeZoneInfo.Local);

                // 框架订单推送即将过期的邮件提醒
                RecurringJob.AddOrUpdate<IFrameOrderRecurringJob>("框架订单推送即将过期的邮件提醒", c => c.SendEmail(), "0 0 0 16 * ? ", TimeZoneInfo.Local);

                // 催办逾期未处理的流程
                RecurringJob.AddOrUpdate<IFlowUrgingRecurringJob>("催办逾期未处理的流程", c => c.AutoFlowUrgingOverdueAsync(), "0 30 7,12 * * ? ", TimeZoneInfo.Local);

                //排课管理新增假期数据
                // RecurringJob.AddOrUpdate<IPKHolidaysJob>("排课管理假期数据", c => c.GenerateWeekendsForYear(), "0 0 0 1-2 0 L *", TimeZoneInfo.Local);

                ////定时修复FlowType丢失问题
                //RecurringJob.AddOrUpdate<IFlowManagerRecurringJob>("定时修复FlowType丢失问题", c => c.AutoReplenishFlowTypeAsync(), "0 7 * * *", TimeZoneInfo.Local);

                // 查看引擎队列数量
                RecurringJob.AddOrUpdate<IEngineAppService>("查看引擎队列数量", c => c.GetEngineCount(), "*/5 * * * *", TimeZoneInfo.Local);

                // 获取当前引擎队列失败数量
                RecurringJob.AddOrUpdate<IEngineAppService>("获取当前引擎队列失败数量", c => c.GetEngineFailedCount(), "*/5 * * * *", TimeZoneInfo.Local);

                // 每天早上8点，未签合同提醒
                RecurringJob.AddOrUpdate<ISFSyncJob>("未签合同提醒", c => c.SyncSendEmail(), "35 8 * * *", TimeZoneInfo.Local);

                // 每天早上9点，试用期定时邮件提醒
                RecurringJob.AddOrUpdate<IUserTrialSyncJob>("试用期定时邮件提醒", c => c.SyncSendEmail(), "0 9 * * *", TimeZoneInfo.Local);

                // 每天早上8点20，定时同步SF基础数据
                RecurringJob.AddOrUpdate<ISFSyncJob>("同步SF审批数据", c => c.SyncSFData(), "20 8 * * *", TimeZoneInfo.Local);

                // 每天早上8点，定时同步HANA基础数据
                RecurringJob.AddOrUpdate<ISFSyncJob>("同步HANA数据", c => c.SyncHanaData(), "0 8,13 * * *", TimeZoneInfo.Local);

                // 每天14:00，15:00，17:00提醒未维护臻辅材库存信息的供应商
                RecurringJob.AddOrUpdate<IZFCInventoryRecurringJob>("未维护臻辅材库存提醒供应商", c => c.SendWeChatMessageToSupplier(), "0 0 14,15,17 * * ? ", TimeZoneInfo.Local);

                // 每天17:00检测未维护臻辅材库存信息的供应商发送邮件给产品人，抄送主管
                RecurringJob.AddOrUpdate<IZFCInventoryRecurringJob>("未维护臻辅材库存邮件给产品人", c => c.SendEmailToSupplierOwner(), "0 0 17 * * ? ", TimeZoneInfo.Local);

                // 每天早上9点30，定时处理干部转身邮件通知数据
                RecurringJob.AddOrUpdate<ICadreSyncJob>("干部转身任务邮件提醒", c => c.CadreJob(), "30 9 * * *", TimeZoneInfo.Local);

                // 每天早上8点，试用期定时催办                
                RecurringJob.AddOrUpdate<IUserTrialSyncJob>("试用期定时催办", c => c.SyncFlowUrging(), "0 8 * * *", TimeZoneInfo.Local);

                // 每天早上3点，定时更新交通费额度表数据
                RecurringJob.AddOrUpdate<IPhoneFeeLimitRecurringJob>("更新交通费额度表数据", c => c.AutoTrafficFeeLimitAsync(), "0 3 * * *", TimeZoneInfo.Local);

                // 每天早上4:30，定时推送交通费额度到费控
                RecurringJob.AddOrUpdate<IPhoneFeeLimitRecurringJob>("定时推送交通费额度到费控", c => c.PushTrafficFeeLimitAsync(), " 30 4 * * ? ", TimeZoneInfo.Local);

                // 每周一8:00，定时发送批次号预警邮件给管理员和产品人
                RecurringJob.AddOrUpdate<IZFCInventoryRecurringJob>("定时发送批次号预警邮件给管理员和产品人", c => c.SendBCOverdueEmailToSupplierOwner(), "0 0 8 ? * MON ", TimeZoneInfo.Local);
            }

            // 每天早上8点定时处理干部转身邮件通知数据
            RecurringJob.AddOrUpdate<ICourseTrainTaskSyncJob>("外海培训提醒邮件及ilearning数据同步", c => c.CourseTrainTaskJob(), "00 8 * * *", TimeZoneInfo.Local);

            // 每天1:30，定时更新供应商信息到SUS
            RecurringJob.AddOrUpdate<IZFCInventoryRecurringJob>("定时更新供应商信息到SUS", c => c.SyncSupplierListToSUS(), "0 30 1 * * ? ", TimeZoneInfo.Local);

            // 每天1:00,12:00,18:00，定时更新新增订单、当天未清订单到SUS
            RecurringJob.AddOrUpdate<IZFCInventoryRecurringJob>("定时更新新增订单到SUS", c => c.UpdateAddQty(), "0 0 1,12,18 * * ? ", TimeZoneInfo.Local);

            // 每天2:00，定时更新历史批次号
            RecurringJob.AddOrUpdate<IZFCInventoryRecurringJob>("定时更新历史批次号", c => c.UpdateHistoryINIQTY(), "0 0 2 * * ? ", TimeZoneInfo.Local);

            // 每天早上8点，定时发布试用期流程 add by liya 20230321
            RecurringJob.AddOrUpdate<IEmployeeRecurringJob>("定时发布试用期流程", c => c.SyncTrialUserProcessAsync(), "0 8 * * *", TimeZoneInfo.Local);

            RecurringJob.AddOrUpdate<IContractUpdateSyncJob>("定时同步电子签法人公司", c => c.SyncEsignCorporate(), "0 8,13 * * *", TimeZoneInfo.Local);

            // 每天早上8点，定时处理合同相关信息（时间卡在人员同步之后）
            RecurringJob.AddOrUpdate<IContractUpdateSyncJob>("处理合同相关信息", c => c.SyncContractData(), "0 8 * * *", TimeZoneInfo.Local);

            // 每天早上4点，定时更新手机费额度表数据
            RecurringJob.AddOrUpdate<IPhoneFeeLimitRecurringJob>("更新手机费额度表数据", c => c.AutoPhoneFeeLimitAsync(), "0 4 * * *", TimeZoneInfo.Local);

            // 手工发票流程定时轮询hana数据库，获取凭证后调用费控接口
            RecurringJob.AddOrUpdate<IRedRushJob>("手工发票定时获取凭证并调用费控接口", c => c.GetSAPVoucher(), "*/5 * * * *", TimeZoneInfo.Local);

            // 手工发票流程定时轮询发送发票下载链接的邮件
            RecurringJob.AddOrUpdate<IRedRushJob>("手工发票流程定时轮询发送发票下载链接的邮件", c => c.PostInvoiceUrlEmail(), "*/5 * * * *", TimeZoneInfo.Local);

            // 手工发票第三方接口回调
            RecurringJob.AddOrUpdate<IRedRushJob>("手工发票流程定时轮询回调第三方接口", c => c.ThirdCallback(), "*/5 * * * *", TimeZoneInfo.Local);

            // 每月4号中午12点，原材料价格预测未提交邮件提醒
            RecurringJob.AddOrUpdate<IYCLWLJGZSYCRecurringJob>("原材料价格预测未提交邮件提醒", c => c.SendEmailForNoticeInstanceNotSubmit(), "0 0 12,17 4 * ?", TimeZoneInfo.Local);

            // 每月4号下午17点，原材料价格预测未审批邮件提醒
            RecurringJob.AddOrUpdate<IYCLWLJGZSYCRecurringJob>("原材料价格预测未审批邮件提醒", c => c.SendEmailForNoticeInstanceProcessing(), "0 0 17 4 * ?", TimeZoneInfo.Local);

            //每月17号12点，排课平台邮件催发提醒
            RecurringJob.AddOrUpdate<IPKPTRecurringJob>("排课平台邮件催发提醒", c => c.SendEmailToPKUserNotice(), "0 0 12 17 * ?", TimeZoneInfo.Local);

            //每月19号12点，排课平台邮件催发有变更及时更新提醒
            RecurringJob.AddOrUpdate<IPKPTRecurringJob>("排课平台邮件催发有变更及时更新提醒", c => c.SendEmailToPKUserUdNotice(), "0 0 12 19 * ?", TimeZoneInfo.Local);

            // 每天早上2点，定时清除Dashboard调用记录
            RecurringJob.AddOrUpdate<IRedisJob>("清除Dashboard调用记录", c => c.ClearRedisLog(), "0 2 * * *", TimeZoneInfo.Local);

            // 每天早上7点，重新推送请销假推送失败数据
            RecurringJob.AddOrUpdate<ILeaveSyncJob>("重新推送请销假推送失败数据", c => c.DoSyncWork(), "0 7 * * *", TimeZoneInfo.Local);

            // 每天早上9点，发送请销假推送失败数据汇总邮件
            RecurringJob.AddOrUpdate<ILeaveSyncJob>("发送请销假推送失败数据汇总邮件", c => c.DoSnendEmailWork(), "0 9 * * *", TimeZoneInfo.Local);

            //// 每天早上2点，定时归档Records表
            //RecurringJob.AddOrUpdate<IEngineJob>("定时归档Records表", c => c.ArchiveRecordsTable(), "0 2 * * *", TimeZoneInfo.Local);

            // 每天早上3点，定时清理LogOnlyForSteps表一个月前的数据
            RecurringJob.AddOrUpdate<ILogOnlyForStepsClearJob>("定时清理LogOnlyForSteps表一个月前的数据", c => c.ClearLogOnlyForStepsData(), "0 3 * * *", TimeZoneInfo.Local);

            // 每隔10分，获取绩效待办信息
            RecurringJob.AddOrUpdate<ISFPerformanceSyncJob>("获取绩效待办信息", c => c.SyncToDoData(), "*/10 * * * *", TimeZoneInfo.Local);

            // 每天早上3点，清理未处理待办
            RecurringJob.AddOrUpdate<ISFPerformanceSyncJob>("绩效待办状态清理", c => c.SyncCategoryData(), "0 3 * * *", TimeZoneInfo.Local);

            // 每天早上8点，定时处理系统查询当前状态为待申请人结案的单据，需要系统催办。
            RecurringJob.AddOrUpdate<ISeminarManageJob>("处理申请人结案待办催办", c => c.SyncSeminarManage(), "0 8 * * *", TimeZoneInfo.Local);

            //每天早上6点30，下午14点30 定时同步岗位代理数据
            RecurringJob.AddOrUpdate<IEmployeeRecurringJob>("定时同步岗位代理数据", c => c.SyncPostRelationAsync(), "30 6,14 * * *", TimeZoneInfo.Local);

            // 每天早上1点30，定时同步SFJD数据
            RecurringJob.AddOrUpdate<ISFSyncJD>("同步SFJD审批数据", c => c.SyncJDData(), "30 1 * * *", TimeZoneInfo.Local);

            //每天早上9点，定时推送产学研系统化内容到期前提醒
            RecurringJob.AddOrUpdate<ICXYXTHNRRecurringJob>("产学研系统化内容到期前提醒", c => c.DoJob(), "0 9 * * *", TimeZoneInfo.Local);

            // 每天早上2点30，定时同步SFJD数据
            RecurringJob.AddOrUpdate<IResumeService>("同步OSS简历文档", c => c.SyncResumeFiles(string.Empty), "*/30 * * * *", TimeZoneInfo.Local);
        }
    }
}